#!/bin/bash
# 首先设置环境变量，以供定时执行
set -u -e
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin


# 需要找到近几个小时的ip地址
ip_hours=20
# 输错密码最多多少次就锁定
err_count=5

#预定义变量
time_list=""
deny_ip=""
deny_iplist=""


get_time () {          # 第一个参数为几个小时

	for((i=0;i<=$1;i++));do
		time_list[$i]="$(printf '%s %s %2d %s'  $(date -d "-$i hours" '+%a %b %-d %H'))"
	done
}

get_deny_iplist () {   # 第一个参数为几个小时 ，第二个参数为输错密码的次数
	for((i=0;i<=$1;i++));do
		temp_row=$(lastb | grep "${time_list[$i]}")
		if [ -z "$deny_ip" ];then
			deny_ip="$temp_row"
		else
			deny_ip+=$'\n'"$temp_row"
		fi
	done
	deny_iplist="$(echo "$deny_ip" | awk -v ec="$2" '{S[$3]++}END{for(i in S) {if(S[i]>=ec){print i}}}')"
}





log_search_ip () {   # 第一个参数为几个小时,第二个参数为输错密码的次数
	echo "$(date '+%F %T')  开始查找近$1个小时，输错密码或用户超过$2次的ip地址..."
	if [ "$deny_iplist" = "" ];then
		echo "$(date '+%F %T')  近$1个小时，无输错密码或用户超过$2次的ip地址"
		exit
	fi
}

	

# 通过iptable配置丢弃这些ip地址的包

iptables_config () {
	for ip in $deny_iplist;do
		if iptables -vnL INPUT | grep -q "$ip";then
			echo "$(date '+%F %T')  iptables中已有$ip的屏蔽规则"
		else
			echo -n "$(date '+%F %T')  正在使用iptables屏蔽...."
			iptables -t filter -A INPUT -s "$ip" -j REJECT && {  echo "已屏蔽$ip的访问！！";echo "$ip" >>  /root/scripts/deny_ip_list.txt; } || echo "屏蔽失败."
		fi
	done
}

main () {
	get_time $ip_hours
	get_deny_iplist $ip_hours $err_count
	log_search_ip $ip_hours $err_count
	iptables_config
}


main
